package designpatterns.proxy.demo03;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author 真香
 * @create 2021-06-01 16:04
 */


// 会用这个类自动生成代理类！
public class ProxyInvocationHandler implements InvocationHandler {


    private Rent rent;

    public void setRent(Rent rent) {
        this.rent = rent;
    }

    /*Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
            new Class<?>[] { Foo.class },
            handler);*/

    // 生成得到代理类
    public Object  getProxy(){

        return  Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
    }




    /**
     * 处理代理实例并返回结果
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 动态代理的本质，就是使用反射机制实现！
       Object  result= method.invoke(rent,args);
       seeHuose();
       fare();
      return result;
    }

    public void seeHuose(){
        System.out.println("中介带看房子");
    }

    public void fare() {
        System.out.println("中介代替房东收费");
    }
}
